import { Dayjs } from 'dayjs'

import { IEventTemplateEnableRes } from '@oBiz/components/EventSelect/api'
import { IWaybillRecordItemWithIndex } from '../../interface'

export type TOperationType = 'addEventTemplate' | 'updateServiceLevel' | 'updateFirstLine' | 'updateTailLines'

// 模块：表单项类型定义
export type TFormItem<C extends React.ComponentType<any> = React.ComponentType<any>> = {
  name: string
  // 允许 label 随依赖变化而动态计算
  label: string | ((record?: IBatchAction) => string)
  // 支持任意组件类型，以便在批量设置中按需传入额外的 props（如 record）
  component: React.ComponentType<any>
  // 为组件的原生 props 提供类型提示，并允许基于依赖动态计算
  componentProps?: React.ComponentProps<C> | ((record?: IBatchAction) => React.ComponentProps<C>)
  // 允许 hidden 随依赖变化而动态计算
  hidden?: boolean | ((record?: IBatchAction) => boolean)
  /** 当这些字段变化时，当前项需要重新计算（hidden/label/componentProps等） */
  dependencies?: string[]
}

export interface IBatchOperationsDrawerProps {
  /** 新增或编辑成功回调 */
  onSuccess?: () => void
  /** 操作类型 */
  operationType: TOperationType
}

type TContent = Omit<IWaybillRecordItemWithIndex, 'currentEvent' | 'currentEdd' | 'nextUpdateTime' | 'etd' | 'eta'> & {
  /** 运单号（必填） */
  waybillNo: string
  /** 轨迹模版（必填） */
  eventTemplate: IEventTemplateEnableRes
  /** 发生时间（必填） */
  eventTime: Dayjs
  /** 当前 EDD（必填） */
  currentEdd?: Dayjs
  /** 更新后的 EDD（必填） */
  updateEdd?: Dayjs
  /** 更新 EDD 的时区（必填） */
  updateEddZone: string
  /** 下次更新时间（可选） */
  nextUpdateTime?: Dayjs
  /** 预计离港（可选，批量首程使用） */
  etd?: Dayjs
  /** 预计到港（可选，批量首程使用） */
  eta?: Dayjs
  /** 模版派生字段（可选，随模版变化） */
  locationType?: IEventTemplateEnableRes['locationType']
  statusGroup?: IEventTemplateEnableRes['statusGroup']
  status?: IEventTemplateEnableRes['status']
  /** 地址信息（可选） */
  street1?: string
  street2?: string
  city?: string
  postalCode?: string
  stateProvince?: string
  countryCode?: string
  departureLocationId?: number
  departureLocationName?: string
  destinationLocationId?: number
  destinationLocationName?: string
}

export type IBatchAction = Partial<{
  // addEventTemplate
  eventTemplate: IEventTemplateEnableRes
  eventTime: Dayjs
  updateEdd: Dayjs
  updateEddZone: string
  nextUpdateTime: Dayjs
  note: string
  // updateServiceLevel
  logisticsChannelServiceLevel: number | string
  logisticsChannelServiceTransitMin: number
  logisticsChannelServiceTransitMax: number
  // updateFirstLine
  carrier: string
  vesselName: string
  voyageNumber: string
  containerNumber: string
  departureLocation: string
  etd: Dayjs
  destinationLocation: string
  eta: Dayjs
  // updateTailLines
  lastMileTransportType: number | string
  lastMileCarrier: string
  currentEdd: Dayjs
  currentEddZone: string
}> &
  Record<string, any>

export interface IFormValue {
  /** 批量设置区域的当前值集合 */
  batchAction: IBatchAction
  /** 列表项的表单值（允许部分初始化） */
  content: Partial<TContent>[]
}
